<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 一 、Promise.all() : 可以执行多个promise对象，获取promise对象的结果
        // all是同时执行promise对象
        // all 收集的结果，必须都是成功的 ，如果失败了就收集不到最终的结果

        
          let p1 = new Promise((resolve,reject)=>{
            setTimeout(() => {
                resolve(111)
            }, 2000);
        })

        let p2 = new Promise((resolve,reject)=>{
            setTimeout(() => {
                resolve(222)
            }, 1000);
        })

        let p3 = new Promise((resolve,reject)=>{
            setTimeout(() => {
                // resolve(3333)
                reject("333err");
            }, 3000);
        })

     let pa=Promise.all([p1,p2,p3]) //只要有一个错误时直接返还rejec状态的值为错误值的失败promise
                                    //全部成功时返回一个成功状态的值为收集到值数组的promise
     
    //     pe.then(res=>{
    //         console.log(res);
    //     }).catch(err=>{     //只要有一个reject失败就走onjected或者catch返还err
                               //写了err回调就错误就会捕捉到err回调中，catch中捕捉不到，不写err才捕捉得到。
    //         console.log(err,'err-catch');
    //     })
        console.log(pa,'err');

        //Promise.all()的实现
        class MyPromise{
            static all(arr){
                return new Promise((resolve,rejected)=>{
                    let arrResulte =[];//用来装载收集到的数据
                    let count=0;//计数用来记录什么时候数据收集完成，调用resolve返还数据。
                    arr.forEach(item => {
                        item.then(res=>{
                            count++
                            arrResulte.push(item);
                            if(count===arr.length){
                                 // 结果收集完毕了，通过reslove返还最后的结果值
                                resolve(arrResulte)
                            }
                        },err=>{
                            // 如果失败了，直接调用reject；
                            rejected(err)
                        })
                    });
                })
            }
        }
    </script>
</body>
</html>